import { COUNTER_DECREMENT, COUNTER_INCREMENT } from '../constants'

export const increment = (payload) => ({ type: COUNTER_INCREMENT, payload })

export const decrementAc = (payload) => ({
  type: COUNTER_DECREMENT,
  payload,
})

// Redux thunk 的写法
// 睡眠函数（一调用，代码的执行就会卡住）
/* const sleep = (ms) => {
  // 函数返回一个 Promise
  return new Promise((resolve) => {
    // Promise 什么时候成功呢？只有等定时器的回调走了之后才成功
    // 说白了什么时候成功，就是你传递过来的那个时间 ms
    setTimeout(() => {
      resolve()
    }, ms)
  })
} */

const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))

// !以后我都会这样写
/* export const decrement = (payload) => {
  return (dispatch) => {
    setTimeout(() => {
      dispatch(decrementAc(payload))
    }, 1000)
  }
} */

// 应用了 redux-thunk 中间件之后的写法
/* export const decrement = (payload) => {
  return async (dispatch) => {
    // await 就会等待右边的 Promise resolve 后的结果
    await sleep(1000)
    dispatch(decrementAc(payload))
  }
} */

// 这种写可以了解一下
export const decrement = async (payload) => {
  // 在这儿也可以写异步代码了，这种写法并不是天生支持的，而是应用了 redux-promise 这个中间件之后才支持的
  await sleep(2000)
  return {
    type: COUNTER_DECREMENT,
    payload,
  }
}
